<?php

namespace com\aristo\ingenieros\model;

include 'com/aristo/ingenieros/view/DocumentDetView.php';
include 'com/aristo/ingenieros/view/ComprobantePendienteView.php';
include 'com/aristo/ingenieros/view/MovimientoView.php';
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

use com\aristo\ingenieros\view\DocumentDetView;
use com\aristo\ingenieros\view\ComprobantePendienteView;
use com\aristo\ingenieros\view\EntityView;
use com\aristo\ingenieros\view\MovimientoView;
use \mysqli;
use \Exception;

/**
 * Description of DocumentQuery
 *
 * @author ARISTO INGENIEROS
 */
class DocumentQuery {

    //put your code here
    public static function getDetalleDocumento($idDocumento, mysqli $con) {
        try {
            $sql = "SELECT
                        c.descripcion,
                        dd.cantidad,
                        dd.valor_unitario
                    FROM
                        documento AS d
                        INNER JOIN detalledocumento AS dd ON dd.documento_id = d.iddocumento
                        INNER JOIN concepto AS c ON dd.concepto_id = c.idconcepto
                    WHERE
                        d.iddocumento = " . $idDocumento;
            $query = $con->query($sql);

            if ($query) {
                if ($query->num_rows > 0) {

                    $detalles = array();
                    while ($row = $query->fetch_row()) {
                        $descripcion = utf8_decode($row[0]);
                        $cantidad = utf8_decode($row[1]);
                        $monto = utf8_decode($row[2]);

                        $detalle = new DocumentDetView();
                        $detalle->setDescripcion($descripcion);
                        $detalle->setCantidad($cantidad);
                        $detalle->setValor_unitario($monto);
                        $detalles [] = $detalle->toJSON();
                    }
                    return $detalles;
                } else {
                    return "NO EXISTE DETALLE";
                }
            } else {
                return "ERROR DE RED. <br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
            }
        } catch (Exception $exc) {
            return 'ERROR EN EL MODELO DE DOCUMENTO: ' . $exc->getMessage() . "<br/>" . nl2br($exc->getTraceAsString());
        }
    }

    public static function getDetalleDocumentoIdOrden($id, mysqli $con) {
        try {
            $sql = "SELECT
                        SUM(dd.cantidad*dd.valor_unitario)
                    FROM
                        documento AS d
                        INNER JOIN detalledocumento AS dd ON dd.documento_id = d.iddocumento
                        INNER JOIN orden_compra_servicio AS ocs ON ocs.documento_id = d.iddocumento
                    WHERE
                        ocs.idorden_compra_servicio = " . $id;
            $query = $con->query($sql);

            if ($query) {
                if ($query->num_rows > 0) {
                    $documento = new EntityView();
                    while ($row = $query->fetch_row()) {
                        $suma = utf8_decode($row[0]);

                        $documento->setMonto($suma);
                    }
                    return $documento;
                } else {
                    return "NO EXISTE DOCUMENTO";
                }
            } else {
                return "ERROR DE RED. <br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
            }
        } catch (Exception $exc) {
            return 'ERROR EN EL MODELO DE DOCUMENTO: ' . $exc->getMessage() . "<br/>" . nl2br($exc->getTraceAsString());
        }
    }

    public static function getComprobantesPendientes(mysqli $con) {
        try {
            $sql = "SELECT
                        ocs.idorden_compra_servicio,
                        d.fecha,
                        ocs.numeracion,
                        ocs.descripcion,
                        detalle_persona.razonsocial
                    FROM
                        documento AS d
                        INNER JOIN tipodocumento AS td ON d.tipodocumento_id = td.idtipodocumento
                        INNER JOIN orden_compra_servicio AS ocs ON d.iddocumento = ocs.documento_id
                        LEFT JOIN comprobante AS cp ON ocs.idorden_compra_servicio = cp.orden_compra_servicio_id
                        INNER JOIN persona AS p ON ocs.proveedor_id = p.idpersona
                        INNER JOIN detalle_persona ON detalle_persona.persona_id = p.idpersona
                    WHERE
                        td.descripcion = 'EGRESO' AND cp.numeracion IS NULL AND d.anulado = 'NO'
                    ORDER BY d.fecha DESC";
            $query = $con->query($sql);

            if ($query) {
                if ($query->num_rows > 0) {
                    $ordenes = array();
                    while ($row = $query->fetch_row()) {
                        $id = utf8_decode($row[0]);
                        $fecha = utf8_decode($row[1]);
                        $numeracion = utf8_decode($row[2]);
                        $descripcion = utf8_decode($row[3]);
                        $razonsocial = utf8_decode($row[4]);

                        $orden = new ComprobantePendienteView();
                        $orden->setId($id);
                        $orden->setFecha($fecha);
                        $orden->setNumeracion($numeracion);
                        $orden->setDescripcion($descripcion);
                        $orden->setRazonsocial($razonsocial);
                        $ordenes [] = $orden->toJSON();
                    }
                    return $ordenes;
                } else {
                    return "NO EXISTE DOCUMENTOS CONFIGURADOS";
                }
            } else {
                return "ERROR DE RED. <br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
            }
        } catch (Exception $exc) {
            return 'ERROR EN EL MODELO DE DOCUMENTO: ' . $exc->getMessage() . "<br/>" . nl2br($exc->getTraceAsString());
        }
    }

    public static function deleteDocumento($id, mysqli $con) {
        try {
            $id = utf8_encode($id);

            $sql = "UPDATE documento SET anulado = 'SI' WHERE iddocumento = " . $id;
            $delete = $con->query($sql);

            if ($delete) {
                $rpta = new EntityView();
                $rpta->setResponse("SUCCESS");
                $rpta->setDescripcion("ELIMINADO CORRECTAMENTE");
                return $rpta->toJSON();
            } else {
                return "ERROR DE RED.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
            }
        } catch (Exception $exc) {
            return 'ERROR EN EL MODELO DE DOCUMENTO: ' . $exc->getMessage() . "<br/>" . nl2br($exc->getTraceAsString());
        }
    }
    
    public static function getMovimientos($anio, $mes, mysqli $con) {
        try {
            $sql = "(
                        SELECT
                        d.fecha AS FECHA,
                        d.anulado,
                        td.descripcion,
                        ri.nro_voucher AS NUMRECIBO,
                        cbt.nrcheque AS NUMORDEN,
                        CONCAT(ccc.codigo,' - ',c.descripcion) AS CUENTA,
                        (dd.cantidad * dd.valor_unitario) AS MONTO
                        FROM
                        documento AS d
                        INNER JOIN tipodocumento AS td ON td.idtipodocumento = d.tipodocumento_id
                        LEFT JOIN recibo_ingreso AS ri ON ri.documento_id = d.iddocumento
                        LEFT JOIN orden_compra_servicio AS ocs ON ocs.documento_id = d.iddocumento
                        INNER JOIN detalledocumento AS dd ON dd.documento_id = d.iddocumento
                        INNER JOIN concepto AS c ON dd.concepto_id = c.idconcepto
                        INNER JOIN detalle_cuentas AS dc ON dc.concepto_id = c.idconcepto
                        INNER JOIN fase AS f ON dc.fase_id = f.idfase
                        LEFT JOIN comprobante AS cbt ON cbt.orden_compra_servicio_id = ocs.idorden_compra_servicio
                        LEFT JOIN cuenta AS ccc ON dc.cuenta_iddebe = ccc.idcuenta
                        WHERE
                        f.descripcion = 'CONTABLE' AND YEAR(d.fecha) LIKE ".$anio." AND MONTH(d.fecha) LIKE ".$mes."
                    )
                    UNION
                    (
                        SELECT
                        d.fecha AS FECHA,
                        d.anulado,
                        td.descripcion,
                        ri.nro_voucher AS NUMRECIBO,
                        cbt.nrcheque AS NUMORDEN,
                        CONCAT(ccc.codigo,' - ',c.descripcion) AS CUENTA,
                        (dd.cantidad * dd.valor_unitario) AS MONTO
                        FROM
                        documento AS d
                        INNER JOIN tipodocumento AS td ON td.idtipodocumento = d.tipodocumento_id
                        LEFT JOIN recibo_ingreso AS ri ON ri.documento_id = d.iddocumento
                        LEFT JOIN orden_compra_servicio AS ocs ON ocs.documento_id = d.iddocumento
                        INNER JOIN detalledocumento AS dd ON dd.documento_id = d.iddocumento
                        INNER JOIN concepto AS c ON dd.concepto_id = c.idconcepto
                        INNER JOIN detalle_cuentas AS dc ON dc.concepto_id = c.idconcepto
                        INNER JOIN fase AS f ON dc.fase_id = f.idfase
                        LEFT JOIN comprobante AS cbt ON cbt.orden_compra_servicio_id = ocs.idorden_compra_servicio
                        LEFT JOIN cuenta AS ccc ON dc.cuenta_idhaber = ccc.idcuenta
                        WHERE
                        f.descripcion = 'CONTABLE' AND YEAR(d.fecha) LIKE ".$anio." AND MONTH(d.fecha) LIKE ".$mes."
                    )
                    UNION
                    (
                        SELECT
                        nc.fecha AS FECHA,
                        nc.eliminado AS anulado,
                        tn.descripcion,
                        '' AS NUMRECIBO,
                        '' AS NUMORDEN,
                        CONCAT(c.codigo,'-',c.descripcion),
                        nc.monto
                        FROM
                        notacontable AS nc
                        INNER JOIN tiponota AS tn ON nc.tiponota_id = tn.idtiponota
                        INNER JOIN cuenta AS c ON nc.cuenta_id = c.idcuenta
                        INNER JOIN seccion_cuenta AS sc ON c.seccion_cuenta_id = sc.idseccion_cuenta
                        INNER JOIN tipo_cuenta AS tc ON sc.tipo_cuenta_id = tc.idtipo_cuenta
                        WHERE
                        tc.descripcion = 'CONTABLE' AND YEAR(nc.fecha) LIKE ".$anio." AND MONTH(nc.fecha) LIKE ".$mes."
                    )
                    ORDER BY FECHA ASC";
            $query = $con->query($sql);

            if ($query) {
                if ($query->num_rows > 0) {
                    $movimientos = array();
                    while ($row = $query->fetch_row()) {
                        $fecha = utf8_decode($row[0]);
                        $esAnulado = utf8_decode($row[1]);
                        $tipo = utf8_decode($row[2]); //ingreso, egreso, credito, debito
                        $numRecibo = utf8_decode($row[3]);
                        $numOrden = utf8_decode($row[4]);
                        $desCuenta = utf8_decode($row[5]);
                        $monto = utf8_decode($row[6]);

                        $mov = new MovimientoView();
                        $mov->setFecha($fecha);
                        $mov->setEsAnulado($esAnulado);
                        $mov->setTipo($tipo);
                        $mov->setNumeracion($numRecibo.$numOrden);
                        $mov->setDesCuenta($desCuenta);
                        $mov->setMonto($monto);
                        $movimientos [] = $mov->toJSON();
                    }
                    return $movimientos;
                } else {
                    return "NO EXISTE DOCUMENTOS CONFIGURADOS";
                }
            } else {
                return "ERROR DE RED. <br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
            }
        } catch (Exception $exc) {
            return 'ERROR EN EL MODELO DE DOCUMENTO: ' . $exc->getMessage() . "<br/>" . nl2br($exc->getTraceAsString());
        }
    }

}